﻿// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "StarrySkyAbilityTypes.h"
#include "GameFramework/Actor.h"
#include "StarrySkyProjectile.generated.h"

class UNiagaraSystem;
class USphereComponent;
class UProjectileMovementComponent;

UCLASS()
class STARRYSKY_API AStarrySkyProjectile : public AActor
{
	GENERATED_BODY()

public:
	AStarrySkyProjectile();

	//抛射物的移动组件
	UPROPERTY(VisibleAnywhere)
	TObjectPtr<UProjectileMovementComponent> ProjectileMovement;
	
	//游戏伤害效果参数,，meta=(ExposeOnSpawn=true) 是一个 元数据（metadata）标记，用于告诉引擎在通过 SpawnActor 函数生成 Actor 时，
	//将该变量暴露给蓝图或 C++ 的 FActorSpawnParameters，从而允许在生成 Actor 时设置该变量的值
	UPROPERTY(BlueprintReadWrite,meta=(ExposeOnSpawn=true))
	FDamageEffectParams DamageEffectParams;
protected:
	virtual void BeginPlay() override;
	virtual void Destroyed() override;
	//用来同意处理抛射物击中物体后播放的特效和音效
	UFUNCTION(BlueprintCallable)
	virtual void OnHit();
	//添加球碰撞体的重叠方法
	UFUNCTION()
	virtual void OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);

	//判断重叠的目标是否有效(不能和能力源角色是同一个Actor)
	bool IsValidOverlap(const AActor* OtherActor) const;
	//判断是否已经命中
	bool bHit=false;
	
	//循环播放音效组件
	UPROPERTY()
	TObjectPtr<UAudioComponent> LoopIngSoundComponent;
private:
	//球体生命周期
	UPROPERTY(EditDefaultsOnly)
	float LifeSpan=15.f;
	//添加一个球体碰撞体组件
	UPROPERTY(VisibleAnywhere)
	TObjectPtr<USphereComponent> Sphere;

	//抛射物没有使用游戏提醒GameplayCue作为击中后的粒子效果，因为GameplayCue会进行服务器的复制，占用服务器游戏提示的复制数量。
	//所以使用自己实现游戏效果，因此必须要在客户端不妨同样也实现击中的后的效果，碰撞校验使在服务器上执行，在客户端上执行，这样才不会出现服务器和客户端的粒子效果不一致的情况。
	//添加撞击特效
	UPROPERTY(EditAnywhere)
	TObjectPtr<UNiagaraSystem> ImpactEffect;
	//添加撞击的音效
	UPROPERTY(EditAnywhere)
	TObjectPtr<USoundBase> ImpactSound;
	//添加飞行中的循环音效
	UPROPERTY(EditAnywhere)
	TObjectPtr<USoundBase> LoopingSound;
};
